const PENDING = "pending";
const FULFILLED = "fulfilled";
const REJECTED = "rejected";
const Promise = function(executor){
	if(!(executor instanceof Function)){
		throw "executor类型错误！"
	}
	this.state = PENDING;// 状态
	this.result = undefined;// 状态值
	// 更改状态为fulfilled,成功值为value
	const _onResolve =function(value){
		// 如果状态被更改，那么不允许执行后续代码（状态只允许更改一次）
		if(this.state !== PENDING) return;
		this.state = FULFILLED;
		this.result = value;
	}
	// 更改状态为rejected,失败的值为value
	const _onReject = function(value){
		if(this.state !== PENDING) return;
		this.state = REJECTED;
		this.result = value;
	}
	try{
		// 调用执行器函数
		executor(_onResolve.bind(this),_onReject.bind(this));
	}catch (value){
		// _onReject.bind(this,value)();
		_onReject.call(this,value)
	}
	
};
Object.assign(Promise.prototype,{
	// onResolved:成功回调
	// onRejected:失败回调
	then(onResolved,onRejected){
		// this--->p
		return new Promise(function(resolve,reject){
		   // 判断p的状态为成功执行onResolved
		   // 判断p的状态为失败执行onRejected
			if(this.state === FULFILLED){
				try{
					// 调用成功回调，成功回调的返回值会影响返回的Promise实例状态和值
					const value = onResolved(this.result);
					// value是否为Promise实例
					if(value instanceof Promise){
						// 是,将then函数返回的Promise实例的状态以及值设置为与value的状态和值相同。
						value.then(resolve,reject);
					}else{
						// 不是Promise实例，将then函数返回的Promise实例设置为成功，值为value
						resolve(value);
					}
				}catch (err){
					reject(err);
				}
				
			}else if(this.state === REJECTED){
				// xhr fetch axios
				try{
					// 调用失败回调，失败回调的返回值会影响返回的Promise实例状态和值
					const value = onRejected(this.result);
					// value是否为Promise实例
					if(value instanceof Promise){
						// 是,将then函数返回的Promise实例的状态以及值设置为与value的状态和值相同。
						value.then(resolve,reject);
					}else{
						// 不是Promise实例，将then函数返回的Promise实例设置为成功，值为value
						resolve(value);
					}
				}catch (err){
					reject(err);
				}
			}
		}.bind(this))
		
		
	},
	catch(){
	
	}
});
export default Promise;